package com.adee.java;

/*
* 一个对象，从加载到jvm，再到被gc清除，都经历了什么过程？
*
* 1. 类的加载
*    1) 首先通过类的全限定名把字节码内容加载到方法区（openjdk中现在叫metaspace）；
*    2) 验证、解析字节码内容；
*    3) 在堆中创建一个Class对象，Class对象就是对字节码内容的一个封装；
* 2. 链接
*    1) 验证，验证字节码内容符合jvm规范；
*    2) 准备，静态变量默认初始化；
*    3) 解析，将常量池中的符号引用转为直接引用；
* 3. 初始化
*    为静态变量赋正确值
* 4. 使用与卸载
*    用new或反射创建一个对象，对象首先被分配在堆的年轻代Eden区，经过一次MinorGC后，对象如果存活，就进入Survivor区，如果对象一直
*    存活，就会在Survivor区来回拷贝，每拷贝一次，年龄加1，当年龄超过15后依然存活，对象就会进入老年代。
*    如果经过fullgc，被标记为垃圾对象，那么就会被gc线程清理掉。
*
* 如何确定一个对象是不是垃圾？
* 1. 引用计数法
*    给堆中的每个对象一个引用计数器，当计数器为0时，记为垃圾，这是早期的jdk实现方式。
*    引用计数法无法解决循环引用的问题。
* 2. 可达性算法
*    这种方式是从根对象往下遍历，能找到的对象就不是垃圾，找不到的就是垃圾。
*
* jvm有哪些垃圾回收算法？
* 1. 标记清除算法
*    a. 标记阶段：把垃圾内存标记出来；
*    b. 清除阶段：直接将垃圾内存回收；
*    c. 这种算法简单，但是有个很严重的问题，就是会产生大量的内存碎片。
* 2. 复制算法
*    为了解决标记清除算法的内存碎片问题，就产生了复制算法。复制算法将内存分为大小相等的两半，每次只是用其中一半。垃圾回收时，
*    将当前这一半内存中存活的对象全部拷贝到另一半中，然后将当前一半内存全部清除。这中算法没有内存碎片问题，但是浪费空间，而且
*    它的效率和存活对象的个数有关。
*    新生代使用复制算法。
* 3. 标记整理算法
*    为了解决复制算法浪费空间的问题，就提出了标记压缩算法。这种算法在标记阶段和标记清除算法是一样的，但是在完成标记后，不是直接
*    清理垃圾内存，而是将垃圾对象往一端移动，然后将边界以外的所有内存直接清除。
*    老年代采用标记整理算法。
*
* 垃圾收集器有哪些？
* 1. Serial 收集器（年轻代）：历史最悠久，单线程工作，回收垃圾时，必须暂停所有其它线程——stop the world，采用复制算法；
* 2. ParNew收集器（年轻代）：本质为Serial收集器的多线程版本，采用复制算法；
* 3. Parallel scavenge（年轻代）：在ParNew基础上，增加了自使用调节功能，以提供最合适的暂停时间和吞吐量，采用复制算法；
* 4. Serial old 收集器（老年代）：是Serial 收集器的老年代版本，同样为单线程，但采用的是“标记-整理”算法；
* 5. Parallel old 收集器（老年代）：Parallel scavenge 收集器的老年代版本，多线程，采用的是“标记-整理”算法；
* 6. CMS 收集器（老年代）：即Concurrent Mark Sweep收集器，以获取最短停顿时间为目标，采用“标记-清除”算法；
* 7. G1 收集器（整堆）： 即Garbage-First收集器，是目前最新的收集器，依然采用分代思想，将堆划分成一个一个的Region，历时十年
*    才实现商用，采用了混合算法，兼有“复制”和“标记-整理”算法的特点；
*
* 垃圾收集器的选择？
* jvm中，使用分代策略，年轻代存活时间短，适合采用复制算法，老年代存活时间长，适合采用标记整理算法。
* 小内存采用CMS合适（小于6G）；
* 大内存采用G1（6~8G以上）。
*
* 如何设置垃圾收集器参数？
* -XX:+UseSerialGC，虚拟机运行在Client模式下的默认值，Serial+Serial Old。
* -XX:+UseParNewGC，ParNew+Serial Old，在JDK1.8被废弃，在JDK1.7还可以使用。
* -XX:+UseConcMarkSweepGC，ParNew+CMS+Serial Old。
* -XX:+UseParallelGC，虚拟机运行在Server模式下的默认值，Parallel Scavenge+Serial Old(PS Mark Sweep)。
* -XX:+UseParallelOldGC，Parallel Scavenge+Parallel Old。
* -XX:+UseG1GC，G1+G1。
*
*
*
*
*
*
* */
public class Test020_ObjectLifeCycle {
    public static void main(String[] args) {

    }
}
